package xim

import (
	"time"

	"gitee.com/xiaoyutab/xgotool/optional/xlog"
	"gitee.com/xiaoyutab/xgotool/xerror"
)

// 初始化用户通讯群
// 此方法会自动根据设备列表初始化群信息
//
//	uid	用户ID
func InitUserChat(uid uint) error {
	// 检测用户设备群是否存在
	chat := Chat{}
	err := _default.DB.Table(_default.ChatTable).
		Where("user_id", uid).
		Where("is_deleted", 0).
		Where("type_id", 1).
		Order("id ASC").
		Limit(1).
		Find(&chat).
		Error
	if err != nil {
		return xlog.AE("用户设备聊天窗信息查询失败", err)
	}
	if chat.Id == 0 {
		// 群聊不存在
		chat.UserId = uid
		chat.TypeId = 1
		chat.Thumb = _default.DefaultDerviceThumb
		chat.Name = _default.DefaultDerviceName
		chat.CreatedAt = time.Now().Format(time.DateTime)
		// 创建该群信息
		err = _default.DB.Table(_default.ChatTable).Create(&chat).Error
		if err != nil {
			return xlog.AE("IM设备通讯聊天窗创建失败", err)
		}
	}
	// 检测群设备信息
	type temp_struct struct {
		ChatUserId         uint `gorm:"chat_user_id"`          // 聊天群所属用户ID
		ChatId             uint `gorm:"chat_id"`               // 聊天群ID
		ChatFromId         uint `gorm:"chat_from_id"`          // 聊天列表ID
		ChatFromIsRecently uint `gorm:"chat_from_is_recently"` // 是否显示在最近聊天列表
		ImUserDervice
	}
	uc := []temp_struct{}
	err = sql.RunNameReplaceScan("sql/dervice-list", sqlRep(0), sqlRep(1), &uc, uid)
	if err != nil {
		return err
	}
	// 缺失的用户信息补足
	for i := 0; i < len(uc); i++ {
		if uc[i].ChatId == 0 {
			// 未创建聊天群，直接返回错误
			return xerror.New("聊天群创建失败")
		}
		if uc[i].ChatUserId == 0 {
			// 创建对应的关联信息
			_default.DB.Table(_default.ChatUserTable).Create(&ChatUser{
				ChatId:       chat.Id,
				UserId:       uid,
				DerviceId:    uc[i].Id,
				IsManagement: 1,
				Nickname:     uc[i].Hostname + "@" + uc[i].Goos + ":" + uc[i].Arch,
				CreatedAt:    time.Now().Format(time.DateTime),
			})
		}
		if uc[i].ChatFromId == 0 {
			// 聊天记录ID为空
			_default.DB.Table(_default.ChatFromTable).Create(&ChatFrom{
				ChatId:     chat.Id,
				UserId:     uid,
				IsRecently: 1,
				CreatedAt:  time.Now().Format(time.DateTime),
			})
		} else if uc[i].ChatFromIsRecently == 0 {
			// 未显示在最近聊天列表中
			_default.DB.Table(_default.ChatFromTable).Where("id", uc[i].ChatFromId).Update("is_recently", 1)
		}
	}
	return nil
}
